/* 格式化打印
* 打印是由一系列macros定义处理的std::fmt
* * format!: 将格式化的文本写入String
* * print!: same as format!,但将文本打印到控制台(io :: stdout)
* * printLn!:  same as print!,但增加了换行符
* * eprint!: same as format!,但文本显示为标准错误（io :: stder）
* * erprintln!: same as eprint!,但增加了换行符 
*/
// 所有解析文本的方式都相同，另外，Rust在编译时检查格式的正确性
fn main() {
	// There are various optional patterns this works with. Positional
    // arguments can be used.
    println!("{0},this is {1},this is {0}", "黎明","悟空");
    //黎明,this is 悟空,this is 黎明

    // as can named arguments.
    // 另外可以用名字声明
    println!("{name1},{name2},{name3}",name3="张三",name1="李毅",name2="八戒");
    //李毅,八戒,张三

    // Special formatting can be specified after a `:`.
    // 特殊格式可以在`：`之后指定。
    println!("{} of {:b} people know binary, the other half doesn't",1,2);
    //1 of 10 people know binary, the other half doesn't

    println!("{:?}",(3, 4)); //->"(3,4)"

    println!("{:04}",42); // 0042

    /*	格式化参数
    * 可以使用许多格式化参数（与format_spec上面的语法相对应）来转换要格式化的每个自变量。这些参数会影响所格式化内容的字符串表示形式。
    */
    // 所有这些均显示“hello x!”
    println!("hello {:5}!","x");
    println!("hello {:1$}!","x",5);
    println!("hello {1:0$}!",5,"x");
    println!("Hello {:width$}！","x",width=5);
 	// hello x    !
	// hello x    !
	// hello x    !
	// Hello x    ！

	/*
	1、这是格式应采用的“最小宽度”的参数。如果值的字符串不能填满这么多字符，则填充/对齐指定的填充将用于占用所需的空间
	2、可以usize通过添加后缀$（表示第二个参数是usize指定宽度）在参数列表中以a的形式提供width的值。
	*/

	// 填充/对齐
	/*
	[fill]<-参数在width列中左对齐
	[fill]^-参数在width列中居中对齐
	[fill]>-参数在width列中右对齐
	*/
	// assert_eq!(format!("Hello {:<5}!"),"x");
	//assert_eq!(format!("Hello {:-<5}!"),"x");
	// assert_eq!(format!("Hello {^5}!"), "x");
	// assert_eq!(format!("Hello {:>5}"), "x");

	//您可以按指定的宽度右对齐文本。这将输出
	println!("{number:>width$}",number=1,width=6 );
	//     1
	println!("{number:>0width$}",number=1,width=6 );
	//000001

	// Rust 甚至能检查确保这正确的数字声明被使用
	// println!("My name is {0},{1}~{0}","redOrange");
	// note: positional arguments are zero-based
	println!("My name is {0},{1}~{0}","redOrange","红橙");
	//My name is redOrange,红橙~redOrange

	//创建一个名为“ Structure”的结构，其中包含一个“ i32”。
	#[allow(dead_code)]
	struct Structure(i32);
	// However, custom types such as this structure require more complicated
    // handling. This will not work.
	//println!("this struct '{}' won't print...",Structure(2));
}

